/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.leulounge.parser;

import com.leulounge.control.Login;
import com.leulounge.model.Client;
import java.lang.reflect.Field;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JLabel;
import javax.swing.JSpinner;

/**
 *
 * @author Salaver
 */
public class Printer extends Thread
{
   TextFileParser parser = new TextFileParser();
   boolean go;
   public String nuevalinea = System.getProperty("line.separator");
   public String cd = "\"";
    
   private void printZReport() throws InterruptedException{
       
       parser.parseZReport();
       go = true;
       while (go){
           String response = parser.checkZReport();
           if (response != "2")
            go = false;
           Thread.sleep(1000);
       }
   } 
   
   private void printBill(Client client) throws InterruptedException{
       parser.parseBill(prepareBill(client));
       go = true;
       while (go){
           String response = parser.checkBill();
           if (response != "2")
            go = false;
           Thread.sleep(1000);
       }
   }
    
   private String prepareBill(Client client){
       DecimalFormatSymbols custom = new DecimalFormatSymbols();
       custom.setDecimalSeparator('.');
       DecimalFormat df = new DecimalFormat("###.##");
       df.setDecimalFormatSymbols(custom);
       SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
       String date = sdf.format(new Date()); 
       double total = 0;
       String document = "";
       document = document + "[E]" + nuevalinea;
//        # Compañía (string) o ""|          Tienda/Caja (String) o ""| Vendedor (String) o ""| Cod_Cliente (String) o ""| Nombre_Cliente (String)| Direccion (String) o ""|          RIF_Cliente (string)| Fecha_Factura (string dd/mm/yyyy) o ""| Num_Factura (String) o ""| Es_Devolucion (1/0)| IdentificadorUnico (String) o ""| Ubicacion (String) o ""| Es_NoFiscal (1/0) | Fecha Factura a Devolver (DD/MM/YYYY) o "" | Hora Factura a Devolver (HH:MM) o "" | Número de Comprobante a Devolver (String) o ""  | Serial Impresora en el que se imprimió la factura devuelta (String) o ""
//        "Totalsoftware de Venezuela, C.A."| "Caracas"|                "Pedro Perez"|          "00001"|                  "Cangrejito, C.A."|       "Las Palmas, Caracas, Venezuela"| "J000000000"|         "16/12/2006"|                           "0102030405"|              0|                   "0001"|                           "M1"|                    0 |                 "" |                                         "" |                                   "" |                                              ""
       document = document +  cd + "INVERSIONES ASERCO 2014, C.A" + cd + "| " +
                              cd + "Caracas" + cd + "| " +                
                              cd + "Vendedor Leu" +cd + "| " +              
                              cd + cd + "| " +                       
                              cd + client.getCliente() + cd + "| " +            
                              cd + client.getDireccion() + cd + "| " +      
                              cd + client.getRif() + cd + "| " +             
                              cd + date + cd + "| " +                                 
                              cd + cd + "| " +                   
                                   0  + "| " +       
                              cd + cd + "| " +      
                              cd + "n/a" +cd + "| " +      
                                    0 + "| " + 
                              cd + cd + "| "+ 
                              cd + cd +"| " + 
                              cd + cd + "| " + 
                              cd + cd + nuevalinea;
       
//       # Cod_Producto (string)| Nombre_Producto (string)| cantidad (Numerico con . como decimal)| Descuento (Numerico con . como decimal)| PorcentajeDeImpuesto (Numerico con . como decimal)| PrecioUnitario (Numerico con . como decimal)| MontoTotal (Numerico con . como decimal)| Es_NoFiscal (1/0)
//         "00001"|               "AGUA POSTABLE"|          2.5|                                    0|                                       9|                                                  2|                                            5|                                        0
       document = document + "[D]" + nuevalinea;
       
       for (int i = 1; i < 59; i++){
           
           try {
               Field field = Login.menu.getClass().getDeclaredField("S"+i);
               field.setAccessible(true);
               JSpinner spinner = (JSpinner) field.get(Login.menu);
               
               field = Login.menu.getClass().getDeclaredField("P"+i);
               field.setAccessible(true);
               JLabel labelP = (JLabel) field.get(Login.menu);
               
               field = Login.menu.getClass().getDeclaredField("T"+i);
               field.setAccessible(true);
               JLabel labelT = (JLabel) field.get(Login.menu);
               
               if (Integer.parseInt(spinner.getValue().toString()) > 0){
                   document = document +
                           cd + "0000" + i + cd + "| " +
                           cd + labelT.getText() + cd + "| " +
                           spinner.getValue().toString() + "| " +
                           0 + "| " +
                           12 + "| " +
                           df.format(Double.parseDouble(labelP.getText().toString()) * 0.88) + "| " +
                           df.format(Double.parseDouble(labelP.getText().toString())*Double.parseDouble(spinner.getValue().toString()) * 0.88) + "| " +
                           0 + nuevalinea;
                   total = total + (Double.parseDouble(labelP.getText().toString())*Double.parseDouble(spinner.getValue().toString()));
               }
           } catch (NoSuchFieldException ex) {
               Logger.getLogger(Printer.class.getName()).log(Level.SEVERE, null, ex);
           } catch (SecurityException ex) {
               Logger.getLogger(Printer.class.getName()).log(Level.SEVERE, null, ex);
           } catch (IllegalArgumentException ex) {
               Logger.getLogger(Printer.class.getName()).log(Level.SEVERE, null, ex);
           } catch (IllegalAccessException ex) {
               Logger.getLogger(Printer.class.getName()).log(Level.SEVERE, null, ex);
           }
       }
//       # MontoTotal (incluyendo IVA) (Numerico con . como decimal)| MontoIVA (Numerico con . como decimal)| Recibido (Numerico con . como decimal)| Vuelto (Numerico con . como decimal)| | Es_NoFiscal (1/0)
//       7.63|                                                        0.63|                                   7.63| 0| 0
       document = document + "[P]" + nuevalinea;
       document = document + df.format(total * 0.88) + "| " + df.format(total * 0.12) + "| " + df.format(total) + "| " + 0 + "| " + 0;
       System.out.println("Bill format: "+document);
       return document;
   }
    
   public void run(String option, Client client) throws InterruptedException
   {
      if (option.equals("bill")){
        printBill(client);  
      } else if (option.equals("Z")){
        printZReport();
      }
   } 
};